package com.longe.util;

import com.longe.config.MinioConfiguration;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

/**
 * minio工具类
 *
 */
@Slf4j
@Component
public class MinioUtil {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfiguration minioConfiguration;

    /**
     * 文件上传
     *
     * @param file      文件
     * @param filename  文件名
     * @param fileType  文件类型
     */
    @SneakyThrows
    public boolean putObject(MultipartFile file, String filename, String fileType) {

        log.info("开始上传文件,文件名为{},文件类型为{}", filename, fileType);
        try {
            InputStream inputStream = new ByteArrayInputStream(file.getBytes());
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(minioConfiguration.getBucketName()).object(filename).stream(
                            inputStream, -1, minioConfiguration.getFileSize())
                            .contentType(fileType)
                            .build());
        } catch (Exception e) {
            e.printStackTrace();
            log.error("上传文件失败,文件名为{},文件类型为{}, 失败信息{}", filename, fileType, e.getMessage());
            return false;
        }

        log.info("上传文件完成,文件名为{},文件类型为{}", filename, fileType);
        return true;
    }

    /**
     * 删除一个对象
     *
     * @param objectName 存储桶里的对象名称
     */
    @SneakyThrows
    public boolean removeObject(String objectName) {

        log.info("开始删除文件,文件名为{}", objectName);
        try {
            minioClient.removeObject(
                    RemoveObjectArgs.builder()
                            .bucket(minioConfiguration.getBucketName()).object(objectName).build());
        } catch (Exception e) {
            e.printStackTrace();
            log.error("删除文件失败,文件名为{},失败信息{}", objectName, e.getMessage());
            return false;
        }

        log.info("删除文件完成,文件名为{}", objectName);
        return true;
    }

}
